package es.usj.tac.meteorologica.controller;

import java.util.List;

import org.apache.log4j.Logger;

import es.usj.tac.meteorologica.dao.DAOException;
import es.usj.tac.meteorologica.dao.DAOFactory;
import es.usj.tac.meteorologica.dto.City;
import es.usj.tac.meteorologica.dto.Country;
import es.usj.tac.meteorologica.dto.Weather;

/**
 * Clase que implementa WebService en nuestro servidor.
 * <p>Mediante esta clase se dara servicio al resto de Internet del listado
 * de los paises y del listado de las ciudades de un pais que se tiene
 * almacenado en BBDD a traves del Servlet AXIS y las peticiones SOAP.
 * <br/>
 * En el WebService se va a declarar tres metodos publicos:
 * <ul>
 * <li>Listado de todos los paises</li>
 * <li>Listado de todas las ciudades de un pais</li>
 * <li>Listado del historico del tiempo para una ciudad</li>
 * </ul>
 * <br/>
 * Los metodos al estar declarados dentro de un Webservice para una mayor
 * facilidad en la serializacion de los objetos se declaran como objetos
 * de respuesta vectores basicos de los objetos de la aplicacion, en vez de
 * devolver un java.util.List con los objetos leidos.
 * <br/>
 * En los metodos se consulta a la BBDD mediante el patron DAO Factory 
 * para obtener los datos y una vez que se tiene el listado se transforma 
 * a un array basico (Country[] / City[]) y se devolvera, 
 * Axis sabra como serializarlo y deserializarlo para su correcto funcionamiento.
 * </p>
 * 
 * @author Alex, Sergio, Nacho 
 * @since 1.0
 * @version 1.3
 */
public class WSDatabase {

	public String error ="";
	private static final Logger log = Logger.getLogger(WSDatabase.class);
	
	/**
	 * Listado de todas los paises.
	 * Obtiene de la bbdd todas los paises que hay introducidos, actualmente por
	 * simplificar la aplicacion se han dejado solo 17 de la UE
	 * @return array con los paises leidos.
	 */
	public Country[] listAllCountries(){
		this.error="";
		Country[] result=null;
		try {
			List<Country> countries = DAOFactory.getInstance().getCountryDAO().listAll();
			int i=0;
			result = new Country[countries.size()];
			for (Country country : countries) {
				result[i++]=country;
			}
			return result;
		} catch (DAOException e) {
			this.error="Error obteniendo todas las ciudades: "+e.getLocalizedMessage();
			log.error("Error obteniendo todas las ciudades",e);
			return new Country[0];
		}
	}
	/**
	 * Listado de las ciudades que tiene un pais.
	 * Obtiene todas la ciudades a partir del identificador del pais.
	 * @param country clave primaria del pais.
	 * @return listado con los datos leidos.
	 */
	public City[] listCitiesByCountry(int country){
		this.error="";
		City[] resultArray;
		try {
			List<City> cities = DAOFactory.getInstance().getCityDAO().listByCountry(country);
			resultArray = new City[cities.size()];
			int i=0;
			for (City city : cities) {
				resultArray[i++] = city;
				
			}
			return resultArray;
		} catch (DAOException e) {
			log.error("Error en el WS obteniendo las ciudades de un pais a partir de su id="+country,e);
			error=e.getLocalizedMessage();
			return new City[0];
		}
	}
	/**
	 * Obtiene los ultimos 15 registros de una ciudad.
	 * Lee de la base de datos el historico y lo devuelve en formato array para 
	 * la ciudad
	 * @param cityName el nombre de la ciudad que se desea saber su historico
	 * @return array con los datos leidos.
	 */
	public Weather[] listHistoricalForCity(String cityName){
		this.error="";
		Weather[] result=null;
		int i=0;
		try {
			City city = DAOFactory.getInstance().getCityDAO().readByName(cityName);
			if(city != null){
				System.out.println("Cityname="+cityName+", city="+(city!=null ? city.toString() : "NULL"));
				List<Weather> weathers = DAOFactory.getInstance().getWeatherDAO().listHistoricalForCity(city.getId());
				for (Weather weather : weathers) {
					System.out.println(weather.toString());
				}
				result = new Weather[weathers.size()];
				for (Weather weather : weathers) {
					result[i++] = weather;
				}
				return result;
			}else{ 
				this.error="No se han encontrado ciudades con el nombre: "+cityName; 
				return new Weather[0];
			}
		} catch (DAOException e) {
			log.error("Error obteniendo el historico de la ciudad="+cityName,e);
			error=e.getLocalizedMessage();
			return new Weather[0];
		}
	}
}
